<!DOCTYPE HTML>
<html lang="en">

<head>
    <!--Setting-->
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1">
    <meta http-equiv="Cache-Control" content="no-siteapp">
    <meta http-equiv="Cache-Control" content="no-transform">
    <meta name="renderer" content="webkit|ie-comp|ie-stand">
    <meta name="apple-mobile-web-app-capable" content="Sanphone&#39;Blog">
    <meta name="apple-mobile-web-app-status-bar-style" content="black">
    <meta name="format-detection" content="telephone=no,email=no,adress=no">
    <meta name="browsermode" content="application">
    <meta name="screen-orientation" content="portrait">
    <meta name="theme-version" content="1.3.0">
    <meta name="root" content="/blog/">
    <link rel="dns-prefetch" href="https://wuxiangfeng.gitee.io/sanphone.gitee.io">
    <!--SEO-->

<meta name="keywords" content="JVM,Java" />


<meta name="description" content="Serial垃圾收集器：单线程，复制算法Serial垃圾收集器基于复制算法实现，它是一个单线程收集器，在它正在进行垃圾收集时，必须暂停其他所有工作线程，直到垃圾收集结束。Serial垃圾收集器采..." />


<meta name="robots" content="all" />
<meta name="google" content="all" />
<meta name="googlebot" content="all" />
<meta name="verify" content="all" />
    <!--Title-->

<title>
    
    垃圾收集器 |
    
    Sanphone&#39;Blog
</title>

<link rel="alternate" href="/atom.xml" title="Sanphone&#39;Blog" type="application/atom+xml">


<link rel="icon" href="/favicon.ico">

    


<link rel="stylesheet" href="/blog/css/bootstrap.min.css?rev=3.3.7.css">
<link rel="stylesheet" href="/blog/css/font-awesome.min.css?rev=4.7.0.css">
<link rel="stylesheet" href="/blog/css/style.css?rev=@@hash.css">

    
<div class="hide">
    <script type="text/javascript">
    var cnzz_protocol = (("https:" == document.location.protocol) ? " https://" : " http://");
    document.write(unescape("%3Cspan class='cnzz_stat_icon_1263868967 hide' %3E%3Cscript%20src%3D%22https%3A%2F%2Fs95.cnzz.com%2Fz_stat.php%3Fweb_id%3D1272564536%22%3E%3C%2Fscript%3E%3C/span%3E%3Cscript src='" + cnzz_protocol + "s19.cnzz.com/z_stat.php%3Fid%3D1263868967%26show%3Dpic1' type='text/javascript'%3E%3C/script%3E"));
    </script>
</div>




    

<meta name="generator" content="Hexo 6.3.0"></head>
<!--[if lte IE 8]>
<style>
    html{ font-size: 1em }
</style>
<![endif]-->
<!--[if lte IE 9]>
<div style="ie">你使用的浏览器版本过低，为了你更好的阅读体验，请更新浏览器的版本或者使用其他现代浏览器，比如Chrome、Firefox、Safari等。</div>
<![endif]-->
<body>
    <header class="main-header"  style="background-image:url(
    https://hexo-theme-snippet-1251680922.cos.ap-beijing.myqcloud.com/img/banner.jpg)"
     >
    <div class="main-header-box">
        <a class="header-avatar" href="/" title='Sanphone'>
            <img src="/blog/img/avatar.jpg" alt="logo头像" class="img-responsive center-block">
        </a>
        <div class="branding">
            <!--<h2 class="text-hide">Snippet主题,从未如此简单有趣</h2>-->
            
            <img src="/blog/img/branding.png" alt="Snippet 博客主题" class="img-responsive center-block">
            
        </div>
    </div>
</header>
    <nav class="main-navigation">
    <div class="container">
        <div class="row">
            <div class="col-sm-12">
                <div class="navbar-header"><span class="nav-toggle-button collapsed pull-right" data-toggle="collapse" data-target="#main-menu" id="mnav">
                        <span class="sr-only"></span>
                        <i class="fa fa-bars"></i>
                    </span>
                    <a class="navbar-brand" href="https://wuxiangfeng.gitee.io/sanphone.gitee.io">
                        Sanphone&#39;Blog</a>
                </div>
                <div class="collapse navbar-collapse" id="main-menu">
                    <ul class="menu">
                        
                        <li role="presentation" class="text-center">
                            <a href="/bolg"><i class="fa "></i>
                                主页</a>
                        </li>
                        
                        <li role="presentation" class="text-center">
                            <a href="/bolg/categories/前端/"><i class="fa "></i>
                                前端</a>
                        </li>
                        
                        <li role="presentation" class="text-center">
                            <a href="/bolg/categories/后端/"><i class="fa "></i>
                                后端</a>
                        </li>
                        
                        <li role="presentation" class="text-center">
                            <a href="/bolg/categories/移动端/"><i class="fa "></i>
                                移动端</a>
                        </li>
                        
                        <li role="presentation" class="text-center">
                            <a href="/bolg/categories/中间件/"><i class="fa "></i>
                                中间件</a>
                        </li>
                        
                        <li role="presentation" class="text-center">
                            <a href="/bolg/categories/工具/"><i class="fa "></i>
                                工具</a>
                        </li>
                        
                        <li role="presentation" class="text-center">
                            <a href="/bolg/archives/"><i class="fa "></i>
                                时间轴</a>
                        </li>
                        
                    </ul>
                </div>
            </div>
        </div>
    </div>
</nav>
    <section class="content-wrap">
        <div class="container">
            <div class="row">
                <main class="col-md-8 main-content m-post">
                    <p id="process"></p>
<article class="post">
    <div class="post-head">
        <h1 id="垃圾收集器">
            
            垃圾收集器
            
        </h1>
        <div class="post-meta">
    
    <span class="categories-meta fa-wrap">
        <i class="fa fa-folder-open-o"></i>
        <a class="category-link" href="/blog/categories/%E5%90%8E%E7%AB%AF/">后端</a> <a class="category-link" href="/blog/categories/%E5%90%8E%E7%AB%AF/JVM/">JVM</a>
    </span>
    
    
    <span class="fa-wrap">
        <i class="fa fa-tags"></i>
        <span class="tags-meta">
            
            <a class="tag-none-link" href="/blog/tags/JVM/" rel="tag">JVM</a> <a class="tag-none-link" href="/blog/tags/Java/" rel="tag">Java</a>
            
        </span>
    </span>
    
    
    
    <span class="fa-wrap">
        <i class="fa fa-clock-o"></i>
        <span class="date-meta">
            2024/02/02</span>
    </span>
    
    <span class="fa-wrap">
        <i class="fa fa-eye"></i>
        <span id="busuanzi_value_page_pv"></span>
    </span>
    
    
</div>
        
        
    </div>
    
    <div class="post-body post-content">
        <h2 id="Serial垃圾收集器：单线程，复制算法"><a href="#Serial垃圾收集器：单线程，复制算法" class="headerlink" title="Serial垃圾收集器：单线程，复制算法"></a>Serial垃圾收集器：单线程，复制算法</h2><p>Serial垃圾收集器基于复制算法实现，它是一个单线程收集器，在它正在进行垃圾收集时，必须暂停其他所有工作线程，直到垃圾收集结束。<br>Serial垃圾收集器采用了复制算法，简单、高效，对于单CPU运行环境来说，没有线程交互开销，可以获得最高的单线程垃圾收集效率，因此Serial垃圾收集器是Java虚拟机运行在Client模式下的新生代的默认垃圾收集器。</p>
<h2 id="ParNew垃圾收集器：多线程，复制算法（Serial的多线程实现）"><a href="#ParNew垃圾收集器：多线程，复制算法（Serial的多线程实现）" class="headerlink" title="ParNew垃圾收集器：多线程，复制算法（Serial的多线程实现）"></a>ParNew垃圾收集器：多线程，复制算法（Serial的多线程实现）</h2><p>ParNew垃圾收集器是Serial垃圾收集器的多线程实现，同样采用了复制算法，它采用多线程模式工作，除此之外和Serial收集器几乎一样。ParNew垃圾收集器在垃圾收集过程中会暂停所有其他工作线程，是Java虚拟机运行在Server模式下的新生代的默认垃圾收集器。<br>ParNew垃圾收集器默认开启与CPU同等数量的线程进行垃圾回收，在Java应用启动时可通过-XX:ParallelGCThreads参数调节ParNew垃圾收集器的工作线程数。</p>
<h2 id="Parallel-Scavenge垃圾收集器：多线程，复制算法"><a href="#Parallel-Scavenge垃圾收集器：多线程，复制算法" class="headerlink" title="Parallel Scavenge垃圾收集器：多线程，复制算法"></a>Parallel Scavenge垃圾收集器：多线程，复制算法</h2><p>Parallel Scavenge收集器是为提高新生代垃圾收集效率而设计的垃圾收集器，基于多线程复制算法实现，在系统吞吐量上有很大的优化，可以更高效地利用CPU尽快完成垃圾回收任务。<br>Parallel Scavenge通过自适应调节策略提高系统吞吐量，提供了三个参数用于调节、控制垃圾回收的停顿时间及吞吐量：</p>
<ul>
<li>-XX:MaxGCPauseMillis: 控制最大垃圾收集停顿时间的参数</li>
<li>-XX:GCTimeRatio:  控制吞吐量大小</li>
<li>-XX:UseAdaptiveSizePolicy: 控制自适应调节策略开启与否</li>
</ul>
<h2 id="Serial-Old垃圾收集器：单线程，标记整理算法"><a href="#Serial-Old垃圾收集器：单线程，标记整理算法" class="headerlink" title="Serial Old垃圾收集器：单线程，标记整理算法"></a>Serial Old垃圾收集器：单线程，标记整理算法</h2><p>Serial Old垃圾收集器是Serial垃圾收集器的老年代实现，同Serial一样采用单线程执行，不同的是，Serial Old针对老年代长生命周期的特点基于标记整理算法实现。Serial Old垃圾收集器是JVM运行在Client模式下的老年代的默认垃圾收集器。<br>新生代的Serial垃圾收集器和老年代的Serial Old垃圾收集器可搭配使用，分别针对JVM的新生代和老年代进行垃圾回收，其垃圾收集过程如图1-15所示。在新生代采用Serial垃圾收集器基于复制算法进行垃圾回收，未被其回收的对象在老年代被Serial Old垃圾收集器基于标记整理算法进行垃圾回收。<br><img src="/blog/../images/img.png" alt="img.png"></p>
<h2 id="Parallel-Old垃圾收集器：多线程，标记整理算法"><a href="#Parallel-Old垃圾收集器：多线程，标记整理算法" class="headerlink" title="Parallel Old垃圾收集器：多线程，标记整理算法"></a>Parallel Old垃圾收集器：多线程，标记整理算法</h2><p>Parallel Old垃圾收集器采用多线程并发进行垃圾回收，它根据老年代长生命周期的特点，基于多线程的标记整理算法实现。Parallel Old垃圾收集器在设计上优先考虑系统吞吐量，其次考虑停顿时间等因素，如果系统对吞吐量的要求较高，则可以优先考虑新生代的Parallel Scavenge垃圾收集器和老年代的Parallel Old垃圾收集器的配合使用。<br>新生代的Parallel Scavenge垃圾收集器和老年代的Parallel Old垃圾收集器的搭配运行过程如图1-16所示。新生代基于Parallel Scavenge垃圾收集器的复制算法进行垃圾回收，老年代基于Parallel Old垃圾收集器的标记整理算法进行垃圾回收。<br><img src="/blog/../images/img_1.png" alt="img_1.png"></p>
<h2 id="CMS垃圾收集器"><a href="#CMS垃圾收集器" class="headerlink" title="CMS垃圾收集器"></a>CMS垃圾收集器</h2><p>CMS（Concurrent Mark Sweep）垃圾收集器是为老年代设计的垃圾收集器，其主要目的是达到最短的垃圾回收停顿时间，基于线程的标记清除算法实现，以便在多线程并发环境下以最短的垃圾收集停顿时间提高系统的稳定性。<br>CMS的工作机制相对复杂，垃圾回收过程包含如下4个步骤。</p>
<ol>
<li>初始标记：只标记和GC Roots直接关联的对象，速度很快，需要暂停所有工作线程。</li>
<li>并发标记：和用户线程一起工作，执行GC Roots跟踪标记过程，不需要暂停工作线程。</li>
<li>重新标记：在并发标记过程中用户线程继续运行，导致在垃圾回收过程中部分对象的状态发生变化，为了确保这部分对象的状态正确性，需要对其重新标记并暂停工作线程。</li>
<li>并发清除：和用户线程一起工作，执行清除GC Roots不可达对象的任务，不需要暂停工作线程。<br>CMS垃圾收集器在和用户线程一起工作时（并发标记和并发清除）不需要暂停用户线程，有效缩短了垃圾回收时系统的停顿时间，同时由于CMS垃圾收集器和用户线程一起工作，因此其并行度和效率也有很大提升。CMS收集器的工作流程如图1-17所示。<br><img src="/blog/../images/img_2.png" alt="img_2.png"></li>
</ol>
<h2 id="G1垃圾收集器"><a href="#G1垃圾收集器" class="headerlink" title="G1垃圾收集器"></a>G1垃圾收集器</h2><p>G1（Garbage First）垃圾收集器为了避免全区域垃圾收集引起的系统停顿，将堆内存划分为大小固定的几个独立区域，独立使用这些区域的内存资源并且跟踪这些区域的垃圾收集进度，同时在后台维护一个优先级列表，在垃圾回收过程中根据系统允许的最长垃圾收集时间，优先回收垃圾最多的区域。G1垃圾收集器通过内存区域独立划分使用和根据不同优先级回收各区域垃圾的机制，确保了G1垃圾收集器在有限时间内获得最高的垃圾收集效率。相对于CMS收集器，G1垃圾收集器两个突出的改进。</p>
<ul>
<li>基于标记整理算法，不产生内存碎片。</li>
<li>可以精确地控制停顿时间，在不牺牲吞吐量的前提下实现短停顿垃圾回收。</li>
</ul>

    </div>
    
    <div class="post-footer">
        <div>
            
            转载声明：
            商业转载请联系作者获得授权,非商业转载请注明出处 © <a href="" target="_blank">Snippet</a>
            
            
        </div>
        <div>
            
        </div>
    </div>
</article>
<div class="article-nav prev-next-wrap clearfix">
    
    
    <a href="/blog/2024/02/02/c++11%E4%B9%8B%E5%88%9D%E5%A7%8B%E5%8C%96%E5%88%97%E8%A1%A8/" class="next-post btn btn-default" title='c++11之初始化列表'>
        <span class="hidden-lg">下一篇</span>
        <span class="hidden-xs">
            c++11之初始化列表</span><i class="fa fa-angle-right fa-fw"></i>
    </a>
    
</div>

<div id="comments">
    
    
<div class="utteranc">
  
  <script
    src='https://utteranc.es/client.js'
    repo='shenliyang/snippet-comment'
    issue-term='pathname'
    issue-number=''
    theme='github-light'
    label=''
    crossorigin='anonymous'
    async
  ></script>
</div>



</div>

                </main>
                
                    <aside id="article-toc" role="navigation" class="col-md-4">
    <div class="widget">
        <h3 class="title">
            Table of Contents
        </h3>
        
        <ol class="toc"><li class="toc-item toc-level-2"><a class="toc-link" href="#Serial%E5%9E%83%E5%9C%BE%E6%94%B6%E9%9B%86%E5%99%A8%EF%BC%9A%E5%8D%95%E7%BA%BF%E7%A8%8B%EF%BC%8C%E5%A4%8D%E5%88%B6%E7%AE%97%E6%B3%95"><span class="toc-text">Serial垃圾收集器：单线程，复制算法</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#ParNew%E5%9E%83%E5%9C%BE%E6%94%B6%E9%9B%86%E5%99%A8%EF%BC%9A%E5%A4%9A%E7%BA%BF%E7%A8%8B%EF%BC%8C%E5%A4%8D%E5%88%B6%E7%AE%97%E6%B3%95%EF%BC%88Serial%E7%9A%84%E5%A4%9A%E7%BA%BF%E7%A8%8B%E5%AE%9E%E7%8E%B0%EF%BC%89"><span class="toc-text">ParNew垃圾收集器：多线程，复制算法（Serial的多线程实现）</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#Parallel-Scavenge%E5%9E%83%E5%9C%BE%E6%94%B6%E9%9B%86%E5%99%A8%EF%BC%9A%E5%A4%9A%E7%BA%BF%E7%A8%8B%EF%BC%8C%E5%A4%8D%E5%88%B6%E7%AE%97%E6%B3%95"><span class="toc-text">Parallel Scavenge垃圾收集器：多线程，复制算法</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#Serial-Old%E5%9E%83%E5%9C%BE%E6%94%B6%E9%9B%86%E5%99%A8%EF%BC%9A%E5%8D%95%E7%BA%BF%E7%A8%8B%EF%BC%8C%E6%A0%87%E8%AE%B0%E6%95%B4%E7%90%86%E7%AE%97%E6%B3%95"><span class="toc-text">Serial Old垃圾收集器：单线程，标记整理算法</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#Parallel-Old%E5%9E%83%E5%9C%BE%E6%94%B6%E9%9B%86%E5%99%A8%EF%BC%9A%E5%A4%9A%E7%BA%BF%E7%A8%8B%EF%BC%8C%E6%A0%87%E8%AE%B0%E6%95%B4%E7%90%86%E7%AE%97%E6%B3%95"><span class="toc-text">Parallel Old垃圾收集器：多线程，标记整理算法</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#CMS%E5%9E%83%E5%9C%BE%E6%94%B6%E9%9B%86%E5%99%A8"><span class="toc-text">CMS垃圾收集器</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#G1%E5%9E%83%E5%9C%BE%E6%94%B6%E9%9B%86%E5%99%A8"><span class="toc-text">G1垃圾收集器</span></a></li></ol>
        
    </div>
</aside>
                
            </div>
        </div>
    </section>
    <footer class="main-footer">
    <div class="container">
        <div class="row">
        </div>
    </div>
</footer>
<a id="back-to-top" class="icon-btn hide">
    <i class="fa fa-chevron-up"></i>
</a>
    <div class="copyright">
    <div class="container">
        <div class="row">
            <div class="col-sm-12">
                <div class="busuanzi">
    
    Total:
    <strong id="busuanzi_value_site_pv">
        <i class="fa fa-spinner fa-spin"></i>
    </strong>
    &nbsp; | &nbsp;
    Visitors:
    <strong id="busuanzi_value_site_uv">
        <i class="fa fa-spinner fa-spin"></i>
    </strong>
    
</div>
            </div>
            <div class="col-sm-12">
                <span>Copyright &copy;
                    2017
                    
                </span> |
                <span>
                    Powered by <a href="//hexo.io" class="copyright-links" target="_blank" rel="nofollow">Hexo</a>
                </span> |
                <span>
                    Theme by <a href="//github.com/shenliyang/hexo-theme-snippet.git" class="copyright-links" target="_blank" rel="nofollow">Snippet</a>
                </span>
            </div>
        </div>
    </div>
</div>



<script async src="//busuanzi.ibruce.info/busuanzi/2.3/busuanzi.pure.mini.js"></script>


<script src="/blog/js/app.js?rev=@@hash.js"></script>

</body>
</html>